Medical Cost Personal

1. Descricao geral do problema


Diabetes

Simples dataset para aplicacao de machine learning

Objetivo: Utilizar a linguagem Python, para prever com base nas informacoes coletadas, qual o custo do seguro saude.


2. Carregando Dados

2.1 Importando bibliotecas necessarias

Comecaremos nosso projeto, importanto todas as bilbiotecas necessarias, para a realizacao das fases iniciais de exploracao, e transformacao dos dados (Data Munging).

In [1]:
# Importando bibliotecas, para a manipulacao e exploracao dos conjuntos de dados.

import numpy as np

import pandas as pd

import random


# Importando bibliotecas, para a plotagem de graficos interativos com o plotly.

import plotly.offline as py

import plotly.graph_objs as go

import plotly.figure_factory as ff

py.init_notebook_mode(connected = False)

# Importando bibliotecas, para a plotagem de graficos com o Seaborn e Matplotlib.

import seaborn as sns

import matplotlib as mpl

import matplotlib.pyplot as plt

# Importando classes e bibliotecas, para a etapa de pre-processamento dos dados.

from sklearn import preprocessing

# Importando classes para calcular algumas estatisticas.

from scipy.stats import kurtosis, skew

# Importando bibliotecas, para a etapa de modelagem preditiva.

from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn import metrics

2.2 Carregando Dados

In [2]:
# Definindo o nome das colunas do dataset.

names = ['idade', 
         'sexo', 
         'imc', 
         'filhos', 
         'fumante', 
         'regiao', 
         'valor']

# Carregando conjunto de dados.

data = pd.read_csv('insurance.csv', names = names, header = 0)
In [3]:
# Exibindo as primeiras linhas do DataFrame.
data.head()
Out[3]:
idade sexo imc filhos fumante regiao valor
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520

3. Data Munging - Preparando dados para a analise exploratoria

Antes de prosseguirmos, e importante destacar a informacao que cada variavel representa:

Variavel Tipo Descricao
idade int64 Idade do benficiario primario;
sexo char Sexo do contratante;
imc int64 Indice de massa corporal;
filhos char Quantidade de filhos cobertos pelo seguro;
fumante char Se o beneficiario primario e fumante;
regiao char Regiao em que o beneficiario;
valor float64 Custo medico individual cobrado pelo saude saude;

3.1 Visao geral dos dados

In [4]:
# Verificando as dimensoes do dataset.

data.shape
Out[4]:
(1338, 7)
In [5]:
# Verificando o número de NAs existentes dentro do dataset.

data.isna().sum()
Out[5]:
idade      0
sexo       0
imc        0
filhos     0
fumante    0
regiao     0
valor      0
dtype: int64

Nao ha valores nulos dentro do conjunto de dados.

In [6]:
# Verificando o tipo de dados das variaveis do dataset.

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1338 entries, 0 to 1337
Data columns (total 7 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   idade    1338 non-null   int64  
 1   sexo     1338 non-null   object 
 2   imc      1338 non-null   float64
 3   filhos   1338 non-null   int64  
 4   fumante  1338 non-null   object 
 5   regiao   1338 non-null   object 
 6   valor    1338 non-null   float64
dtypes: float64(2), int64(2), object(3)
memory usage: 73.3+ KB

Existem 4 variaveis numerias e 3 variaveis categoricas

In [7]:
# Contabilizando o número de valores unicos em cada variavel do dataset.

info = data.nunique().sort_values()

# Determinando o tipo de dado de cada uma das variaveis do dataset.

info = pd.DataFrame(info.values, index = info.index, columns = ['NUniques'])

# Atribuindo informacoes sobre o tipo de dado das variaveis ao DataFrame.

info['dtypes'] = data.dtypes

# Exibindo Dataframe.

info
Out[7]:
NUniques dtypes
sexo 2 object
fumante 2 object
regiao 4 object
filhos 6 int64
idade 47 int64
imc 548 float64
valor 1337 float64

4. Analise exploratoria dos dados

4.1 Criando funcoes auxiliares

Iremos definir algumas funcoes, para padronizar as plotagens de graficos que criaremos.

4.1.1 Para a plotagem de graficos interativos

Para fazer plotagens offline com o plotly (isto e, em ambientes como o Google Colab, Azure, Kaggle, Nteract, etc.), precisamos definir a funcao a seguir, e chama-la sempre que formos gerar um grafico.

In [8]:
# Definindo uma funcao, para plotar graficos interativos, em um ambiente jupyter nao-padrao.

def configure_plotly_browser_state():
  
  import IPython
  
  display(IPython.core.display.HTML('''
        <script src="/static/components/requirejs/require.js"></script>
        <script>
          requirejs.config({
            paths: {
              base: '/static/base',
              plotly: 'https://cdn.plot.ly/plotly-1.43.1.min.js?noext',
            },
          });
        </script>
        '''))

4.1.2 Graficos de Distribuicao

Os graficos de distribuicao sao usados para mostrar como as variaveis sao distribuidas ao longo do tempo, ajudando a identificar valores discrepantes e tendencias.

In [9]:
# Definindo uma funcao, para criar graficos de Boxplot interativos com o plotly.

def plotBoxplot(data, name = '', col = '', target = '', title = '', yaxis = '', xaxis = '', kind = 'normal',
                color = ['#8783D1', '#FADF63', '#06D6A0', '#662E9B'], opacity = 0.65, template = 'plotly_white', 
                orientation = 'v'):
    
    # Realizando as pre-configuracoes necessarias, para a plotagem do grafico interativo.

    configure_plotly_browser_state()

    # Plota graficos de um ou mais boxplots simples.

    if kind == 'normal': 

        # Plota graficos verticais.

        if orientation == 'v':

            # Definindo os dados, a cor, o nome e a transparencia que serao utilizados para criar cada um dos Boxplots.
            
            dataTrace = [
                go.Box(
                    y      = data[l], 
                    name   = l if name == '' else name, 
                    marker = {'color': color[2], "opacity": opacity}) 
                for l in data.columns
            ]
        
        # Plota graficos horizontais.

        else:

            # Definindo os dados, a cor, o nome e a transparencia que serao utilizados para criar cada um dos Boxplots.

            dataTrace = [
                go.Box(
                    x      = data[l], 
                    name   = l if name == '' else name, 
                    marker = {'color': color[3], "opacity": opacity}) 
                for l in data.columns
            ]

    # Plota graficos boxplot, para uma variavel numerica, agrupada por uma variavel categorica.

    elif kind == 'groups':
        
        # Captura os registros pertencentes a cada categoria, da variavel categorica.

        g = [data[data[target] == cat] for cat in data[target].cat.categories]

        # Converte a primeira letra do nome de cada categoria para maiúscula.

        name = [n.capitalize() for n in data[target].cat.categories]

        # Plota graficos verticais.

        if orientation == 'v':
            
            # Definindo os dados, a cor, o nome e a transparencia que serao utilizados para criar cada um dos Boxplots.

            dataTrace = [
                go.Box(
                    y      = g[l][col], 
                    name   = name[l], 
                    marker = {'color': color[l], "opacity": opacity}) 
                for l in range(0, len(g))
            ]
        
        # Plota graficos horizontais.

        else:

            # Definindo os dados, a cor, o nome e a transparencia que serao utilizados para criar cada um dos Boxplots.

            dataTrace = [
                go.Box(
                    x      = g[l][col], 
                    name   = name[l], 
                    marker = {'color': color[l], "opacity": opacity}) 
                for l in range(0, len(g))
            ]
    
    # Defindo as configuracoes de layout.

    layout = go.Layout (
        title    = title,
        yaxis    =  {'title': yaxis},
        xaxis    =  {'title': xaxis},
        template = template
    )

    # Criando uma Figure, com os dados e o layout defindos.

    fig = go.Figure(data = dataTrace, layout = layout)

    # Plotando o Figure com o pyplot.

    py.iplot(fig)
In [10]:
# Definindo uma funcao, para criar Histogramas interativos com o plotly.

def plotHist(data, col = '', target = '', title = '', yaxis = '', xaxis = '', 
             groups = False, color = ['#8783D1', '#FADF63', '#EF476F'], opacity = 0.65, 
             template = 'plotly_white'):
    
    # Realizando as pre-configuracoes necessarias, para a plotagem do grafico interativo.

    configure_plotly_browser_state()
    
    # Criando um histograma para um conjunto de dados.

    if groups == False:

        # Definindo os dados, a cor, e a transparencia que serao utilizados para criar o Histograma.

        dataTrace = go.Histogram(x = data, marker = {'color': color[2], "opacity": opacity})

    # Criando um histograma para um conjunto de dados agrupado por categorias.

    else:
        
        # Captura os registros pertencentes a cada categoria, da variavel categorica.

        g = [data[data[target] == cat] for cat in data[target].cat.categories]

        # Definindo os dados, a cor, e a transparencia que serao utilizados para criar cada um dos Histogramas.

        dataTrace = [
            go.Histogram(
                x      = g[cat][col], 
                name   = data[target].cat.categories[cat].capitalize(), 
                marker = {'color': color[cat], "opacity": opacity}) 
            for cat in range(0,len(g))
        ]

    # Defindo as configuracoes de layout.

    layout = go.Layout(
        title    = title,
        yaxis    =  {'title': yaxis},
        xaxis    =  {'title': xaxis},
        bargap   = 0.05,
        template = template
    )

    # Criando uma Figure, com os dados e o layout defindos.

    fig = go.Figure(data = dataTrace, layout = layout)

    # Plotando o Figure com o pyplot.

    py.iplot(fig)
In [11]:
# Definindo uma funcao, para criar graficos de Densidade interativos com o plotly.

def plotDensity(data, col = '', target = '', title = '', xaxis = '', group = False,
                yaxis = 'Densidade', color = ['#8783D1', '#776a2d', '#3AAED8'], 
                template = 'plotly_white'):
    
    # Realizando as pre-configuracoes necessarias, para a plotagem do grafico interativo.

    configure_plotly_browser_state()

    # Criando um grafico de Densidade para o conjunto de dados.

    if group == False:

        # Definindo os dados, a cor, e os labels que serao utilizados para criar o grafico de Densidade.

        fig = ff.create_distplot (
            [data], 
            group_labels = [xaxis], 
            colors       = [color[2]], 
            show_hist    = False, 
            show_rug     = False
        )

    # Criando um grafico de Densidade para o conjunto de dados agrupado por categorias.

    else:

        # Captura os registros pertencentes a cada categoria, da variavel categorica.

        g = [data[data[target] == cat][col] for cat in data[target].cat.categories]
        
        # Definindo os dados, a cor, e os labels que serao utilizados para criar cada um dos graficos de Densidade.

        fig = ff.create_distplot (
            g, 
            group_labels = [n.capitalize() for n in data[target].cat.categories], 
            colors       = color, 
            show_hist    = False, 
            show_rug     = False
        )

    # Defindo as configuracoes de layout.

    fig.update_layout (
        title_text = title, 
        yaxis      = {"title_text": yaxis}, 
        xaxis      = {"title_text": xaxis}, 
        template   = template
    )

    # Plotando o Figure com o pyplot.

    fig.show()

4.1.3 Graficos de Comparacao

Os graficos de comparacao sao usados para comparar um ou mais conjuntos de dados. Eles podem comparar itens ou mostrar diferencas ao longo do tempo.

In [12]:
# Definindo uma funcao, para criar graficos de Barra interativos com o plotly.

def plotBar(data, col = '', target = '', title = '', yaxis = '', xaxis = '', kind = 'normal', 
            color = ['#8783D1', '#FADF63', '#FF9F43', '#EE6352', '#FC7A1E'], opacity = 0.65, 
            template = 'plotly_white', orientation = 'v'):
    
    # Realizando as pre-configuracoes necessarias para a plotagem do grafico interativo.

    configure_plotly_browser_state()

    # Criando graficos na vertical.

    if orientation == 'v':

        # Plotando grafico de barras simples.

        if kind == 'normal':
            
            # Definindo os dados, a cor, orientacao e a transparencia que serao utilizados para criar as barras.

            dataTrace = go.Bar (
                x           = data.index, 
                y           = data.values, 
                marker      = {'color': color[2], "opacity": opacity}, 
                orientation = orientation
            ) 
        
        # Plotando grafico de barras agrupado por uma variavel categorica.

        elif kind == 'groups':
            
            # Captura os registros pertencentes a cada categoria, da variavel categorica.

            g = [data[data[target] == cat] for cat in data[target].cat.categories]

            # Definindo os dados, a cor, orientacao e a transparencia que serao utilizados para criar as barras.

            dataTrace = [
                go.Bar (
                    x           = g[cat][col], 
                    y           = g[cat]['count'], 
                    name        = data[target].cat.categories[cat].capitalize(),
                    marker      = {'color': color[cat], "opacity": opacity}, 
                    orientation = orientation) 
                for cat in range(0,len(g))
            ]
    
    # Criando graficos na horizontal.

    else:

        # Plotando grafico de barras simples.
        
        if kind == 'normal':
            
            # Definindo os dados, a cor, orientacao e a transparencia que serao utilizados para criar as barras.

            dataTrace = go.Bar(
                x           = data.values, 
                y           = data.index, 
                marker      = {'color': color[3], "opacity": opacity}, 
                orientation = orientation
            ) 
        
        # Plotando grafico de barras agrupado por uma variavel categorica.

        elif kind == 'groups': 

            # Captura os registros pertencentes a cada categoria, da variavel categorica.

            g = [data[data[target] == cat] for cat in data[target].cat.categories]

            # Definindo os dados, a cor, orientacao e a transparencia que serao utilizados para criar as barras.

            dataTrace = [
                go.Bar(
                    x           = g[cat]['count'], 
                    y           = g[cat][col], 
                    name        = data[target].cat.categories[cat].capitalize(), 
                    marker      = {'color': color[cat], "opacity": opacity}, 
                    orientation = orientation) 
                for cat in range(0,len(g))
            ]

    # Defindo as configuracoes de layout.

    layout = go.Layout(
        title    = title,
        yaxis    = {'title': yaxis},
        xaxis    = {'title': xaxis},
        template = template
    )

    # Criando uma Figure, com os dados e o layout defindos.

    fig = go.Figure(data = dataTrace, layout = layout)

    # Definindo que as barras devem ser dispostas uma ao lado da outra caso estejam agrupadas por categoria.
    # Para criar Stacked Bars, utilize: 'stack'.

    fig.update_layout(barmode = 'group')  

    # Plotando o Figure com o pyplot.

    fig.show()

4.1.4 Graficos de Composicao

Os graficos de composicao sao usados para exibir partes de um todo e mudar ao longo do tempo.

In [13]:
# Definindo uma funcao, para realizar a plotagem de graficos de pizza.

def plotPie(data, title = ''):

    # Realizando as pre-configuracoes necessarias, para a plotagem do grafico interativo.

    configure_plotly_browser_state()

    # Defindo as configuracoes de layout.

    layout = go.Layout (
        title = title
    )

    # Criando uma Figure, com os dados e o layout defindos.

    fig = go.Figure (
        data   = [
            go.Pie(
                labels = [i[0].upper() + i[1:] for i in dataCounts.index], 
                values = dataCounts.values, 
                hole = .1)
        ],
        layout = layout
    )

    # Adicionando uma borda branca em cada uma das fatias da pizza.

    fig.update_traces (
        marker = dict (
            line = dict (
                color = '#FFFFFF', 
                width = 1
            )
        )
    )

    # Plotando a Figure com o pyplot.

    fig.show()

4.1.5 Graficos de Relacionamento

Os graficos de relacionamento sao usados para mostrar uma conexao ou correlacao entre duas ou mais variaveis.

In [14]:
# Definindo uma funcao, para realizar a plotagem de graficos de correlacao.

def plotCorr(corr, figsize = (18, 18), cmap = 'Blues', title = 'Grafico de Correlacao entre as variaveis do Data Frame'):
    
    # Criando uma mascara, com as mesmas dimensoes da matriz de correlacao.

    mask = np.zeros_like(corr)

    # Selecionando a matriz triangular inferior da mascara.

    mask[np.triu_indices_from(mask)] = True

    # Definindo as dimensoes do grafico a ser plotado.

    _, ax = plt.subplots(figsize = figsize)

    # Criando o grafico Heatmap.

    ax = sns.heatmap (
        data       = corr, 
        mask       = mask, 
        vmax       = .3, 
        linewidths = .5,
        square     = True, 
        cmap       = cmap,
        annot      = True
    )

    # Definindo o titulo do grafico.

    ax = ax.set_title(title)

4.1.6 Funcoes para calcular estatisticas

Criaremos uma funcao, para padronizar as estatisticas que calcularemos, em cada uma das variaveis a serem estudadas.

In [15]:
# Definindo uma funcao, para gerar um dataframe, com as estatisticas de uma variavel do dataset.

def varStats(col, data, target = ''):

    if target == '':

        # Criando um dataframe, com as estatisticas da variavel especificada.
        
        stats = pd.DataFrame({
            'min'   : data[col].min(),
            'Q1'    : data[col].quantile(.25),
            'Median': data[col].median(),
            'Mean'  : data[col].mean(),
            'Q3'    : data[col].quantile(.75),
            'SD'    : data[col].std(),
            'Sk'    : skew(data[col]),
            'Ck'    : kurtosis(data[col])
        }, index = [col])

    else:

        # Criando um dataframe, com as estatisticas da variavel especificada, agrupada pela variavel target.

        stats = pd.concat([
            data[[col, target]].groupby(target).min(),
            data[[col, target]].groupby(target).quantile(.25),
            data[[col, target]].groupby(target).median(),
            data[[col, target]].groupby(target).mean(),
            data[[col, target]].groupby(target).quantile(.75),
            data[[col, target]].groupby(target).std(),
            data[[col, target]].groupby(target).skew(),
            data[[col, target]].groupby(target).apply(lambda group: kurtosis(group)[0])

        ], axis = 1)

        # Renomeando as colunas do DataFrame.

        stats.columns = ['min', 'Q1', 'Median', 'Mean', 'Q3', 'SD', 'Sk', 'Ck']

    # Retornando os resultados obtidos.
    
    return stats

O coeficente de Assimetria (Skewness), indica como os dados estao distribuidos, e para interpretar seu resultado podemos olhar a tabela a seguir:

indice de Assimetria Descricao
SK ≈ 0 Os dados sao simetricos. Tanto a cauda do lado direito, quanto a do lado esquerdo da funcao densidade de probabilidade, sao iguais;
SK < 0 A assimetria e negativa. A cauda do lado esquerdo da funcao densidade de probabilidade, e maior que a do lado direito e;
SK > 0 A assimetria e positiva. A cauda do lado direito da funcao densidade de probabilidade, e maior que a do lado esquerdo.

O coeficiente de Curtose (Kurtosis), e uma medida que caracteriza o achatamento da curva da funcao de distribuicao, e para interpretar seu resultado, podemos olhar a tabela a seguir:

indice de Curtose Descricao
CK ≈ 0 A distribuicao e normal, e e chamada de Curtose Mesocúrtica;
CK < 0 A Cauda e mais leve que a normal. Para um coeficiente de Curtose negativo, tem-se uma Curtose Platicúrtica e;
CK > 0 A Cauda e mais pesada que a normal. Para um coeficiente de Curtose positivo, tem-se uma Curtose Leptocúrtica.

4.2 Explorando a distribuicao de cada variavel individualmente

4.2.1 Variavel idade

In [16]:
# Definindo o nome da variavel a ser analisada.

col = 'idade'

# Definindo a descricao da variavel nos graficos.

label = 'Idade do beneficiario'

# Contabilizando a frequencia absoluta de cada categoria presente na variavel especificada.

dataCounts = data[col].value_counts()

# Plotando um grafico de barras para as variaveis especificadas.

plotBar (
    data        = dataCounts,
    title       = 'Frequencia absoluta das categorias da Feature ' + col, 
    yaxis       = label, 
    xaxis       = 'Frequencia Absoluta',
    orientation = 'v'
)

Percebe-se que um grande numero de beneficiarios tem menos de 20 anos.

In [17]:
# Criando um grafico de Densidade para a variavel especificada.

plotDensity (
    data  = data[col], 
    title = 'Grafico de Densidade para a variavel ' + col, 
    xaxis = label
)
In [18]:
# Plotando um grafico de boxplot para as variavel especificada.

plotBoxplot (
    data  = data[[col]],
    title = 'Boxplot para a variavel ' + col,
    xaxis = 'Variavel',
    name  = label
)

Nao foi registrado nenhum outlier

In [19]:
# Calculando algumas estatisticas para a variavel especificada.

varStats(col, data = data)
Out[19]:
min Q1 Median Mean Q3 SD Sk Ck
idade 18 27.0 39.0 39.207025 51.0 14.04996 0.05561 -1.244921

Destacamos que:

  • A media e a mediana da variavel idade apresenta valores bem proximos;
  • O coeficiente de assimetria (Sk) indica que os dados apresentam simetria;
  • O coeficiente de curtose (Ck) evidencia que a calda e mais leve que a normal, ou seja, temos uma Curtose Leptocúrtica.

4.2.2 Variavel IMC

In [20]:
# Definindo o nome da variavel a ser analisada.

col = 'imc'

# Definindo a descricao da variavel nos graficos.

label = 'IMC'

# Contabilizando a frequencia absoluta de cada categoria presente na variavel especificada.

dataCounts = data[col].value_counts()

# Plotando um grafico de histograma para a variavel especificada.

plotHist (
    data = data[col],
    title = 'Histograma para a variavel ' + col,
    xaxis = label,
    yaxis = 'Frequencia Absoluta'
)

A medicina demonstrou que o controle de peso tem um papel importante no tratamento e desenvolvimento de uma nova vida com diabetes. Em particular, a prevencao da obesidade e do sobrepeso tambem reduz o risco de outras doencas crônicas perigosas, como a pressao arterial alta.

O indice de massa corporal (IMC) ou Body mass index (BMI) e um valor especial que mostra se o peso de uma pessoa esta em um nivel adequado ou nao. Este valor se calcula em funcao da relacao entre o peso e a altura, de acordo com a formula:

$IMC (kg / m^2) = Peso (kg) / [Altura (m)]^2$

De modo geral, em adultos, o IMC normal fica entre 18,5 a 23 $kg / m^2$. Quanto mais alto seja o número, mais peso sobra, e mais obeso e e deve comecar a emagrecer de forma razoavel.

A partir de uma analise da formula utilizada para calcular o IMC, podemos concluir que os registros em que seu valor e 0 sao erros.

In [21]:
# Criando um grafico de Densidade para a variavel especificada.

plotDensity (
    data  = data[col], 
    title = 'Grafico de Densidade para a variavel ' + col, 
    xaxis = label
)
In [22]:
# Plotando um grafico de boxplot para a variavel especificada.

plotBoxplot (
    data  = data[[col]],
    title = 'Boxplot para a variavel ' + col,
    xaxis = 'Variavel',
    name  = label
)
In [23]:
# Calculando algumas estatisticas para a variavel especificada.

varStats(col, data = data)
Out[23]:
min Q1 Median Mean Q3 SD Sk Ck
imc 15.96 26.29625 30.4 30.663397 34.69375 6.098187 0.283729 -0.055023

Destacamos que:

  • A media e a mediana do valor da BMI apresentam valores proximos;
  • O coeficiente de assimetria (Sk) confirma que os dados apresentam uma assimetria à direita;
  • O coeficiente de curtose (Ck) evidencia que a calda e mais leve que a normal, ou seja, temos uma curtose Platicúrtica.

4.2.3 Variavel filhos

In [24]:
# Definindo o nome da variavel a ser analisada.

col = 'filhos'

# Definindo a descricao da variavel nos graficos.

label = 'Quantidade de filhos'

# Contabilizando a frequencia absoluta de cada categoria presente na variavel especificada.

dataCounts = data[col].value_counts()

# Plotando um grafico de histograma para a variavel especificada.

plotHist (
    data = data[col],
    title = 'Histograma para a variavel ' + col,
    xaxis = label,
    yaxis = 'Frequencia Absoluta'
)

4.2.4 Variavel sexo

In [25]:
# Definindo o nome da variavel a ser analisada.

col = 'sexo'

# Definindo a descricao da variavel nos graficos.

label = 'Sexo'

# Contabilizando a frequencia absoluta de cada categoria presente na variavel especificada.

dataCounts = data[col].value_counts()

# Plotando um grafico de histograma para a variavel especificada.

plotHist (
    data = data[col],
    title = 'Histograma para a variavel ' + col,
    xaxis = label,
    yaxis = 'Frequencia Absoluta'
)
In [26]:
# Plotando um grafico de pizza para a variavel especificada.

plotPie (
    data  = dataCounts, 
    title = 'Frequencia relativa das categorias da feature ' + col
)

Dataset balanceado para a variavel idade

4.2.5 Variavel Fumante

In [27]:
# Definindo o nome da variavel a ser analisada.

col = 'fumante'

# Definindo a descricao da variavel nos graficos.

label = 'Fumante'

# Contabilizando a frequencia absoluta de cada categoria presente na variavel especificada.

dataCounts = data[col].value_counts()

# Plotando um grafico de histograma para a variavel especificada.

plotHist (
    data = data[col],
    title = 'Histograma para a variavel ' + col,
    xaxis = label,
    yaxis = 'Frequencia Absoluta'
)

MAior proporcao de beneficiarios nao fumantes

In [28]:
# Plotando um grafico de pizza para a variavel especificada.

plotPie (
    data  = dataCounts, 
    title = 'Frequencia relativa das categorias da feature ' + col
)

4.2.6 Variavel Regiao

In [29]:
# Definindo o nome da variavel a ser analisada.

col = 'regiao'

# Definindo a descricao da variavel nos graficos.

label = 'Regiao'

# Contabilizando a frequencia absoluta de cada categoria presente na variavel especificada.

dataCounts = data[col].value_counts()

# Plotando um grafico de barras para as variavel especificada.

plotBar (
    data  = dataCounts,
    title = 'Frequencia absoluta das categorias da Feature ' + col, 
    yaxis = 'Frequencia Absoluta', 
    xaxis = label
)
In [30]:
# Plotando um grafico de pizza para a variavel especificada.

plotPie (
    data  = dataCounts, 
    title = 'Frequencia relativa das categorias da feature ' + col
)

Uma pequena maioria contabilizada na regiao sudoeste.

4.2.7 Variavel valor

In [31]:
# Definindo o nome da variavel a ser analisada.

col = 'valor'

# Definindo a descricao da variavel nos graficos.

label = 'Valor'

# Contabilizando a frequencia absoluta de cada categoria presente na variavel especificada.

dataCounts = data[col].value_counts()

# Plotando um grafico de histograma para a variavel especificada.

plotHist (
    data = data[col],
    title = 'Histograma para a variavel ' + col,
    xaxis = label,
    yaxis = 'Frequencia Absoluta'
)

Grande parte dos registros se encontram ate o valor de 14K

In [32]:
# Criando um grafico de Densidade para a variavel especificada.

plotDensity (
    data  = data[col], 
    title = 'Grafico de Densidade para a variavel ' + col, 
    xaxis = label
)
In [33]:
# Plotando um grafico de boxplot para as variaveis especificadas.

plotBoxplot (
    data  = data[[col]],
    title = 'Boxplot para a variavel ' + col,
    xaxis = 'Variavel',
    name  = label
)
In [34]:
# Calculando algumas estatisticas para a variavel especificada.

varStats(col, data = data)
Out[34]:
min Q1 Median Mean Q3 SD Sk Ck
valor 1121.8739 4740.28715 9382.033 13270.422265 16639.912515 12110.011237 1.51418 1.595821

Destacamos que:

  • A media e a mediana do valor da BMI apresentam valores bem distantes;
  • O coeficiente de assimetria (Sk) confirma que os dados apresentam uma assimetria à direita;
  • O coeficiente de curtose (Ck) evidencia que a calda e mais leve que a normal, ou seja, temos uma curtose Platicúrtica.

5. Alterando o encoding das variaveis categoricas

In [35]:
#encoding a coluna "sexo":

data.replace({'sexo':{'male':0, 'female':1}},inplace = True)

#encoding a coluna "fumante":

data.replace({'fumante':{'yes':0, 'no':1}},inplace = True)

#encoding a coluna "regiao":

data.replace({'regiao':{'southeast':0,'northwest':1,'southwest':2,'northeast':3,}},inplace = True)
In [36]:
data.head()
Out[36]:
idade sexo imc filhos fumante regiao valor
0 19 1 27.900 0 0 2 16884.92400
1 18 0 33.770 1 1 0 1725.55230
2 28 0 33.000 3 1 0 4449.46200
3 33 0 22.705 0 1 1 21984.47061
4 32 0 28.880 0 1 1 3866.85520

5.1 Extraindo Features dos conjuntos de dados

Nesta etapa, iremos segmentar os registros em dados de treino e de teste.

In [37]:
# Criando conjunto de dados de treino e de teste.

trainFeatures, testFeatures, trainTarget, testTarget = train_test_split (
    data.drop('valor', axis = 1), data['valor'], test_size = 0.20
)
In [38]:
# Verificando as novas dimensoes do DataFrame preditor de treino.

trainFeatures.shape
Out[38]:
(1070, 6)
In [39]:
# Verificando as novas dimensoes do DataFrame preditor de teste.

testFeatures.shape
Out[39]:
(268, 6)
In [40]:
# Verificando a dimensao da variavel alvo no treino

trainTarget.shape
Out[40]:
(1070,)
In [41]:
# Verificando a dimensao da variavel alvo no teste

testTarget.shape
Out[41]:
(268,)

6. Modelagem Preditiva

6.1 Linear Regression

In [42]:
#iniciando o modelo

model = linear_model.LinearRegression()
In [43]:
#treinando o modelo com os dados de treino

model.fit(trainFeatures.values,trainTarget)
Out[43]:
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
In [44]:
#avaliando os valores previstos com os dados de treino

pred_train = model.predict(trainFeatures.values)
In [45]:
# R2Score dos dados de treino:

r2s_train = metrics.r2_score(trainTarget, pred_train)
print("R2Score:", r2s_train)
R2Score: 0.7539528509889822
In [46]:
#avaliando o modelo com os dados de teste

pred_test = model.predict(testFeatures.values)
In [47]:
# R2Score dos dados de teste:

r2s_test = metrics.r2_score(testTarget, pred_test)
print("R-squared value:", r2s_test)
R-squared value: 0.7333412353349895

6.2 Previsoes com dados novos

In [49]:
# Produz a matriz com os novos dados de entrada para a previsao

IDADE = 60
SEXO = 1
BMI = 23.001
FILHOS = 2
FUMANTE = 1
REGIAO = 3

# Lista com os valores das variaveis

dados_nova_casa = [IDADE, SEXO, BMI, FILHOS, FUMANTE, REGIAO]

# Reshape

Xp = np.array(dados_nova_casa).reshape(1, -1)
M = model.predict(Xp)

# Previsao

print("O custo provavel do seguro sera: $", M[0])
O custo provavel do seguro sera: $ 11851.648143464452